package drds.configuration.ddlparser.sql;


import drds.configuration.ddlparser.ddl.CreateTable;
import drds.configuration.ddlparser.ddl.table.Column;
import drds.configuration.ddlparser.ddl.table.DataType;
import drds.configuration.ddlparser.ddl.table.PrimaryKeyStrategy;

/**
 * 创建表
 */
public class CreateCreateTable {
    public static String sql(CreateTable createTable) {
        StringBuilder sb = new StringBuilder("");
        sb.append("create table").append(DataType.space).append(createTable.getTableName()).append("(").append(DataType.newLine);
        int size = createTable.columnList.size();
        int index = 0;
        for (Column column :
                createTable.columnList) {
            //针对不同的类型进行处理
            sb.append(column.getColumnName()).append(DataType.space);//
            DataType dataType = column.getDataType();
            if (column.getDataType() == DataType.TINYINT ||//
                    dataType == DataType.SMALLINT || //
                    dataType == DataType.MEDIUMINT || //
                    dataType == DataType.INT || //
                    dataType == DataType.BIGINT) {//


                if (column.getDataType() == DataType.TINYINT) {
                    sb.append("tinyint");
                } else if (column.getDataType() == DataType.SMALLINT) {
                    sb.append("smallint");
                } else if (column.getDataType() == DataType.MEDIUMINT) {
                    sb.append("smallint");
                } else if (column.getDataType() == DataType.INT) {
                    sb.append("int");
                } else if (column.getDataType() == DataType.BIGINT) {
                    sb.append("bigint");
                } else {
                    throw new RuntimeException("else");
                }
                sb.append("(").append(column.getLength()).append(")");
                sb.append(DataType.space);
                if (column.isUnsigned()) {
                    sb.append("unsigned");
                    sb.append(DataType.space);
                }
                //
                //`id` bigint(20) NOT NULL AUTO_INCREMENT,
                sb.append("not null");
                sb.append(DataType.space);

                if (!column.isSupportPrimaryKey()) {
                    sb.append("default ");
                    sb.append(column.getDefaultValue());
                } else {
                    sb.append("primary key ");
                    if (column.getPrimaryKeyStrategy().equals(PrimaryKeyStrategy.auto_increment)) {
                        sb.append("auto_increment ");
                    }
                }


            } else if (dataType == DataType.DATE_TIME_LONG) {
                sb.append("bigint(14) not null default 0");
            } else if (dataType == DataType.DECIMAL) {

                sb.append("decimal");
                sb.append("(").append(column.getInteger() + column.getPrecision()).append(",").append(column.getPrecision()).append(")");
                sb.append(DataType.space);
                //
                if (column.isUnsigned()) {
                    sb.append("unsigned");
                    sb.append(DataType.space);
                }
                //
                sb.append("not null");
                sb.append(DataType.space);
                //
                sb.append("default");
                sb.append(DataType.space);
                sb.append(column.getDefaultValue());
            } else if (dataType == DataType.VARCHAR || dataType == DataType.CHAR) {
                if (dataType == DataType.VARCHAR) {
                    sb.append("varchar");
                } else {
                    sb.append("char");
                }
                sb.append("(").append(column.getLength()).append(")");
                sb.append(DataType.space);
                //
                sb.append("not null");
                sb.append(DataType.space);
                //
                sb.append("default");
                sb.append(DataType.space);
                sb.append("'").append(column.getDefaultValue()).append("'");
            } else {
                throw new RuntimeException("else");
            }
            if (index == size - 1) {
                sb.append(DataType.newLine);
            } else {
                sb.append(",").append(DataType.newLine);
            }
            index++;


        }
        sb.append(");");
        return sb.toString();
    }
}
